/// 摩尔斯电码翻译器核心类
class MorseTranslator {
  // 字符到摩尔斯电码的映射
  static const Map<String, String> _charToMorse = {
    'A': '.-',    'B': '-...',  'C': '-.-.',  'D': '-..',   'E': '.',
    'F': '..-.',  'G': '--.',   'H': '....',  'I': '..',    'J': '.---',
    'K': '-.-',   'L': '.-..',  'M': '--',    'N': '-.',    'O': '---',
    'P': '.--.',  'Q': '--.-',  'R': '.-.',   'S': '...',   'T': '-',
    'U': '..-',   'V': '...-',  'W': '.--',   'X': '-..-',  'Y': '-.--',
    'Z': '--..',
    
    '0': '-----', '1': '.----', '2': '..---', '3': '...--', '4': '....-',
    '5': '.....', '6': '-....', '7': '--...', '8': '---..', '9': '----.',
    
    '.': '.-.-.-', ',': '--..--', '?': '..--..', "'": '.----.',
    '!': '-.-.--', '/': '-..-.', '(': '-.--.', ')': '-.--.-',
    '&': '.-...', ':': '---...', ';': '-.-.-.', '=': '-...-',
    '+': '.-.-.', '-': '-....-', '_': '..--.-', '"': '.-..-.',
    '\$': '...-..-', '@': '.--.-.', ' ': '/',
  };

  // 摩尔斯电码到字符的映射（反向映射）
  static final Map<String, String> _morseToChar = {
    for (var entry in _charToMorse.entries) entry.value: entry.key
  };

  /// 将文本转换为摩尔斯电码
  /// 
  /// [text] 要转换的文本
  /// 返回摩尔斯电码字符串，字符之间用空格分隔，单词之间用 / 分隔
  static String textToMorse(String text) {
    if (text.isEmpty) return '';
    
    final buffer = StringBuffer();
    final upperText = text.toUpperCase();
    
    for (int i = 0; i < upperText.length; i++) {
      final char = upperText[i];
      
      if (_charToMorse.containsKey(char)) {
        buffer.write(_charToMorse[char]);
        // 在字符之间添加空格（除了最后一个字符）
        if (i < upperText.length - 1) {
          buffer.write(' ');
        }
      } else if (char == ' ') {
        // 空格表示单词分隔，用 / 表示
        buffer.write('/ ');
      } else {
        // 未知字符保持原样
        buffer.write(char);
        if (i < upperText.length - 1) {
          buffer.write(' ');
        }
      }
    }
    
    return buffer.toString().trim();
  }

  /// 将摩尔斯电码转换为文本
  /// 
  /// [morse] 摩尔斯电码字符串
  /// 返回解码后的文本
  static String morseToText(String morse) {
    if (morse.isEmpty) return '';
    
    final buffer = StringBuffer();
    // 按空格分割摩尔斯电码
    final codes = morse.split(' ');
    
    for (var code in codes) {
      if (code.isEmpty) continue;
      
      if (code == '/') {
        // / 表示单词分隔（空格）
        buffer.write(' ');
      } else if (_morseToChar.containsKey(code)) {
        buffer.write(_morseToChar[code]);
      } else {
        // 未知的摩尔斯电码，保持原样
        buffer.write(code);
      }
    }
    
    return buffer.toString();
  }

  /// 验证字符串是否是有效的摩尔斯电码
  /// 
  /// [morse] 要验证的字符串
  /// 返回 true 如果是有效的摩尔斯电码
  static bool isValidMorse(String morse) {
    if (morse.isEmpty) return true;
    
    final codes = morse.split(' ');
    for (var code in codes) {
      if (code.isEmpty) continue;
      if (code == '/') continue;
      
      // 检查是否只包含点和横线
      if (!RegExp(r'^[.\-]+$').hasMatch(code)) {
        return false;
      }
      
      // 检查是否是有效的摩尔斯电码
      if (!_morseToChar.containsKey(code)) {
        return false;
      }
    }
    
    return true;
  }

  /// 获取所有支持的字符列表
  static List<String> getSupportedCharacters() {
    return _charToMorse.keys.toList()..sort();
  }

  /// 获取字符对应的摩尔斯电码
  static String? getCharMorse(String char) {
    return _charToMorse[char.toUpperCase()];
  }
}

